package cn.kshost.zqyg.manager.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.kshost.zqyg.manager.exception.ZhongQiaoException;
import cn.kshost.zqyg.manager.helper.MenuHelper;
import cn.kshost.zqyg.manager.helper.TreeNodeHelper;
import cn.kshost.zqyg.manager.mapper.SysMenuMapper;
import cn.kshost.zqyg.manager.service.SysMenuService;
import cn.kshost.zqyg.model.entity.system.SysMenu;
import cn.kshost.zqyg.model.entity.system.SysUser;
import cn.kshost.zqyg.model.vo.common.ResultCodeEnum;
import cn.kshost.zqyg.model.vo.system.SysMenuVo;
import cn.kshost.zqyg.utils.AuthContextUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class SysMenuServiceImpl implements SysMenuService {
    @Autowired
    private SysMenuMapper sysMenuMapper;
    @Override
    public List<SysMenu> finNodes() {

        List<SysMenu> sysMenus = sysMenuMapper.selectAllMenu();
        return TreeNodeHelper.getTreeNodes(sysMenus);



    }

    @Override
    public void addMenu(SysMenu sysMenu) {
        sysMenuMapper.insertMenu(sysMenu);
    }

    @Override
    public void removeMenu(SysMenu sysMenu) {
        //用法有子菜单抛出异常不能删除
       Long count  =  sysMenuMapper.selectCountById(sysMenu.getId());
       if (count > 0){
           throw new ZhongQiaoException(ResultCodeEnum.NODE_ERROR);
       }
        sysMenuMapper.deleteMenu(sysMenu);
    }

    @Override
    public void updateMenu(SysMenu sysMenu) {
        sysMenuMapper.updateMenu(sysMenu);

    }

    @Override
    public List<SysMenuVo> menus() {
        //获取用户id
        Long userId = AuthContextUtil.getValue().getId();
        //根据id查询所有菜单
        List<SysMenu>  sysMenuList = sysMenuMapper.selectMenuByUserId(userId);
        
        List<SysMenu> distinctSysMenuList = sysMenuList.stream()
                .filter(menu -> menu.getStatus() == 1)  // 过滤出 sta tus 为 1 的记录
                .collect(Collectors.toMap(
                        SysMenu::getId,        // 使用 id 作为唯一键去重
                        menu -> menu,          // 直接保留对象
                        (existing, replacement) -> existing // 如果 id 重复，保留第一个出现的记录
                ))
                .values()
                .stream()
                .collect(Collectors.toList());  // 转换为 List


        //封装数据
        List<SysMenuVo> sysMenuVos = MenuHelper.build(distinctSysMenuList);
        //返回数据
        return  sysMenuVos;
    }

}
